このページは私用WordPressの覚え書き兼、テストページです。
「SNSボタン」は、テスト検証用に仮設置しているだけなので、押しても反応しません。

018_2 カテゴリーの条件分岐がうまくいかない

(備忘録)


今、このblogでは、右側のサイドバー(sidebar.php)に、カテゴリーが「wordpress」の記事一覧を「目次」として表示させています。

この部分を、カテゴリーが「PHP」の時は「PHPの記事一覧」に切り替えるよう、条件分岐で変化させたいと思ったのですが、うまく動かず、数時間悩みました。


切り替えるための条件分岐

どこで条件分岐させるかは、いくつか方法があるかと思うのですが

現在 sidebar.php 内に、
<!--特定のカテゴリー(カテゴリー名=wordpress)の記事タイトル一覧をすべて表示する--> のコードを入れていて、
その箇所を、カテゴリーが「wordpress」なら○○の処理、カテゴリーが「PHP」の時は△△△の処理をする、という条件分岐のコードに修正するのが一般的かもしれません。


しかし今回は、sidebar.php をコピー流用して、sidebar-2.php というのを作り、
投稿記事のカテゴリーが「wordpress」なら sidebar.phpを、
カテゴリーが「PHP」の時はsidebar-2.php を表示する
、という方法をとってみることにしました。


それで、index.php の

<!-- サイドバー -->
<?php get_sidebar(); ?>
という箇所を条件分岐に書き換えたんですが、うまくいかない・・・


何故効かないのか・・・ しばらく悩みまくった後、・・・Σ(゚д゚;)ハッ と気がつきました。


条件分岐はどのファイルに入れるのか?

効かなかった理由は、条件分岐を index.php に入れていた為でした。
index.php ではなく single.phparchive.php に入れなければいけなかったのです。

記事をクリックで表示されるのは single.php、カテゴリー(またはメニュー)をクリックで表示されるのは archive.php
この条件分岐は index.php上ではそもそも入れても意味がなかった・・・onz

index.php は、一般的には最近の投稿が最新順に数件並び、カテゴリーも混在、というテンプレートなので、この条件分岐を入れる意味はなく、実際、条件分岐を index.php に入れても効きません
※ただし、オリジナルテーマに single.php と archive.php を作っていなかった場合は、index.php が代用されるので、記述する必要がでてきます。
(index.php の中身が長く複雑になってしまうので、シンプルに single.php と archive.php を作ってしまった方が楽かなと思いますが。)


single.php に入れる条件分岐

内容=カテゴリーが「php=ID 142」なら sidebar-2.php を出力、それ以外なら sidebar.php を出力する。

※archive.php とほぼ一緒ですが、single.php は、in_category()としています。

<!-- サイドバー -->
	<?php wp_reset_query(); if(in_category('142')):	//もしカテゴリーがID 142の「PHP」だったら ?>
		<?php get_sidebar('2'); ?>
	<?php else:	//それ以外は ?>
		<?php get_sidebar(); ?>
	<?php endif; ?>

in_category()」と「is_category()」の違い 参考URL→ 図解WordPress「この際はっきりさせておきたい in_category() と is_category() の違い」


archive.php に入れる条件分岐

内容=同じく、カテゴリーが「php=ID 142」なら sidebar-2.php を出力、それ以外なら sidebar.php を出力する。

※archive.php では、is_category()としています。

<!-- サイドバー -->
	<?php wp_reset_query(); if(is_category('142')):	//もしカテゴリーがID 142の「PHP」だったら ?>
		<?php get_sidebar('2'); ?>
	<?php else:	//それ以外は ?>
		<?php get_sidebar(); ?>
	<?php endif; ?>


sidebar.php には以下をいれています

(sidebar-2.php との違いは、「目次タイトル」=2行目と「カテゴリーID」=6行目のみ)

<!--特定のカテゴリー(wordpressのみ)の記事タイトル一覧をすべて表示する-->
<li><h3>wordpress関連の記事 - 目次</h3>
<?php
    $myQuery = new WP_Query(); // WP_Queryオブジェクト生成
    $param = array( //パラメータ。
		'cat' => '26', // カテゴリーID26の「wordpress」のみを表示。
        'posts_per_page' => '-1', //(整数)表示する記事数。-1 ならすべての投稿を取得。
        'post_status' => 'publish', //取得するステータスを指定:publish=公開済みのものだけ
        'orderby' => 'date', //並び替え引数。日付で並べる。
        'order' => 'asc' //昇順。古い記事が上。
    );
    $myQuery->query($param);  // クエリにパラメータを渡す
?>
<ul>
<?php if($myQuery->have_posts()): while($myQuery->have_posts()) : $myQuery->the_post(); ?>
        <li><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>の詳細へ">■<?php the_title(); ?></a></li>
<?php endwhile; endif; ?>
<?php wp_reset_query(); ?>
</ul>
</li>


sidebar-2.php には以下をいれています

(sidebar.php との違いは、「目次タイトル」=2行目と「カテゴリーID」=6行目のみ)

<!--特定のカテゴリー(PHP)の記事タイトル一覧をすべて表示する-->
<li><h3>PHP関連の記事 - 目次</h3>
<?php
    $myQuery = new WP_Query(); // WP_Queryオブジェクト生成
    $param = array( //パラメータ。
		'cat' => '142', // カテゴリーID 142の「PHP」のみを表示。
        'posts_per_page' => '-1', //(整数)表示する記事数。 -1 ならすべての投稿を取得。
        'post_status' => 'publish', //取得するステータスを指定:publish=公開済みのものだけ
        'orderby' => 'date', //並び替え引数。日付で並べる。
        'order' => 'asc' //昇順。古い記事が上。
    );
    $myQuery->query($param);  // クエリにパラメータを渡す
?>
<ul>
<?php if($myQuery->have_posts()): while($myQuery->have_posts()) : $myQuery->the_post(); ?>
        <li><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>の詳細へ">■<?php the_title(); ?></a></li>
<?php endwhile; endif; ?>
<?php wp_reset_query(); ?>
</ul>
</li>


カテゴリーIDの番号は、カテゴリーを作り直したり、blogを新しく作り直したりすると変わります。 その都度ID番号を直すのを忘れずに。


018_1・・・もし~なら「if構文」「条件分岐」

(※条件分岐、覚書メモ)


wordpressでは、if構文条件分岐タグは、頻繁に使うので、まとめておきます。

どこに書くかの決まりはなく、使いたい php ファイルに書きます。
例えば「投稿ページと固定ページではヘッダー画像を変えたい」という場合であれば、ヘッダー画像を出力させている header.php でしょうし、
「新着リストの中でカテゴリー毎に何かの表示を変えたい」という事であれば、その新着リストを出力している固定ページだったり、或いはトップページだったりするでしょう。


条件分岐の基本

<?php if (条件) : ?>
 条件にあてはまる場合の処理
<?php else: ?>
 それ以外の場合の処理
<?php endif; ?>



(例):モバイルとPCで別の文章を表示したい

<?php if ( wp_is_mobile() ) : ?>
 モバイルから閲覧の場合の処理
<?php else: ?>
 それ以外=PCからの閲覧の場合の処理
<?php endif; ?>

wp_is_mobile() とは、wordpress にあらかじめ用意されているタグです。
「モバイル(スマホ・タブレット)から閲覧されているかどうか」という判定をします。
但し wp_is_mobile() のタグでは正確な分岐にはならない、もっと細かく各モバイル毎に設定をした方がいい、という意見もあります。
wp_is_mobile() を使うかどうかについては、また別の記事でまとめたいと思います。
 → ■004_2 wp_is_mobile タグを使うか否か


else: は省略できる

<?php if ( 条件 ) : ?>
  条件にあてはまるものをココに書く
<?php endif; ?>
「それ以外の場合=何もしない」 ということであれば、
このように else: を省略してしまってもOKです。


elseif: で細かな条件分岐ができる

<?php if ( is_single() ) : ?>
 もし「個別記事」なら、△△△する
<?php elseif ( is_page() ) : ?>
 もし「固定ページ」なら、×××する
<?php else: ?>
 それ以外なら、○○○する
<?php endif; ?>
条件分岐を複数にした時は、elseif: を使います。
elseif:何回繰り返してもよく、条件をいくつでも増やすことができます。



もし「○○でない場合」という書き方

<?php if ( !is_single() ) : ?>
 個別ページでなかったら、の場合の処理をココに書く
<?php endif; ?>
条件の前に ! をつけると、否定形=「○○でない場合」になります。


複数の条件に当てはまる時(AND)

<?php if ( wp_is_mobile() && is_single() ) : ?>
  「モバイル」かつ「記事ページ」の場合の処理をココに書く
<?php endif; ?>
AND○○であり尚且つ△△でもある、という場合は、&& で、複数を繋げることができます。

いずれかの条件にしか当てはまらない時(OR)

<?php if ( wp_is_mobile() || is_single() ) : ?>
  「モバイル」あるいは「記事ページ」の場合の処理をココに書く
<?php endif; ?>
OR○○または△△、と、どれかにあてはまる場合、としたい時には、|| で、複数を繋げます。


スペルミスはエラーになる。
コロン括弧を書き間違えたり、書き忘れたりしないようにしましょう。
下記は特に間違えやすいので、注意しましょう。

ifとelseifの後には、コロン[:]
if(): と elseif(): というように書きます。 ; と書くとエラーになります。

endifの後には、セミコロン[;]
endif; と書きます。 : ではありません。

() や <> の数は合っているか
括弧は、ちゃんと閉じないとエラーになります。

全角文字(かなモード)で記号を入力しない
コロン[:]、セミコロン[;]、括弧や&&の記号、スペースなど、すべて欧文英数字(ローマ字モード)で入力すること。
日本語=全角文字(かなモード)は使わない。
意識せずに「全角スペース」を使ってしまっている方も多いです。これもダメです。

「何故かstyle.css が効かない!」という場合、ファイル中に「全角スペース」がないか、再確認してください。 「全角スペース」が含まれていると css は効かないです。




コメントを活用しよう

<?php if(条件): //◯◯のとき ?>
  ◯◯の条件の場合の処理をここに書く
<?php else: //◯◯でないとき?>
  それ以外の場合の処理をここに書く
<?php endif; //◯◯の条件分岐終了 ?>
// を書くと、続く一文はコメントになります。

複数行のコメントは、また別の書き方があります。
phpの外、htmlのコメントの書き方も、また別でちょっと違います。




if構文(例:)トップページだけ

<?php if ( is_home() || is_front_page() ) : ?>
 もし home.php または front.php なら の処理をここに書く
<?php else: ?>
 それ以外の場合の処理をここに書く
<?php endif; ?>
is_front_page() も書くことで、固定ページをホームに固定したときにも認識してくれるようになります。


if構文(例:)ホームの1ページ目だけ

<?php if( ( is_home() || is_front_page() ) && !is_paged() ) : ?>
	ホームの1ページ目のみに表示させたい処理をココに書く
<?php endif; ?>
さきほどの条件分岐だと、ホームの2ページ目(次の記事一覧)以降でも表示されます。
こちらの条件分岐であれば「ホームかつ1ページ目のとき」にのみ表示させることができます。


if構文(例:)個別記事ページだけ

<?php if ( is_single() ) : ?>
	「個別記事」ページでのみ表示する処理をココに書く
<?php else: ?>
	それ以外の処理をここに書く
<?php endif; ?>



if構文(例:)固定ページだけ

<?php if ( is_page() ) : ?>
	「固定ページ」でのみ表示する処理をココに書く
<?php else: ?>
	それ以外の処理をここに書く
<?php endif; ?>



if構文(例:)投稿ページもしくは固定ページだけ

<?php if ( is_singular() ) : ?>
	「投稿ページ」もしくは「固定ページ」で表示する処理をココに書く
<?php else: ?>
	それ以外の処理をここに書く
<?php endif; ?>



if構文(例:)特定の記事ページだけ

<?php if ( is_single('投稿ID') ) : ?>
	指定した記事でのみ表示する処理をココに書く
<?php else: ?>
	それ以外の処理をここに書く
<?php endif; ?>
「この記事のときだけは表示するものを変えたい」「この記事のときだけ表示したい」というときに使います。
'投稿ID'は、記事をプレビューしたりした時に、記事のURLを見ると、
	~/wp018.html?preview_id=255
	
などと表示されるので、それで知ることができます。



if構文(例:)特定の記事ページだけ(複数あるとき)

<?php if ( is_single( array('投稿ID','投稿ID','投稿ID') ) ) : ?>
	指定した記事でのみ表示する処理をココに書く
<?php else: ?>
	それ以外の処理をここに書く
<?php endif; ?>
例えば、<?php if( is_single( array('5','15','100') ) ): ?> とすると
「投稿IDが5、15、100のページ」と「それ以外のページ」で表示が切り替えられるようになります。
, の数を増やせば、いくつでもまとめて指定することができます。


if構文(例:)特定の固定ページだけ

<?php if ( is_page('ページID') ) : ?>
	指定した固定ページでのみ表示する処理をココに書く
<?php else: ?>
	それ以外の処理をここに書く
<?php endif; ?>
固定ページIDも同じく、編集画面のURLで調べられます。


if構文(例:)特定の固定ページだけ(複数)

<?php if ( is_page( array('ページID','ページID','ページID') ) ) : ?>
	指定した固定ページでのみ表示する処理をココに書く
<?php else: ?>
	それ以外の処理をここに書く
<?php endif; ?>
例えば <?php if( is_page( array('1','5') ) ): ?> というように書きます。
また、数字を入れるとIDですが、数字の他に、スラッグ名タイトルも入れることができます。
   ↓
<?php if ( is_page( array( 17, 'beef-stew', 'Irish Stew' ) ) ) : ?>
ID17投稿スラッグが "beef-stew"、またはタイトルが "Irish Stew" のいずれかにあてはまる投稿が表示されている場合
となります。
数字=投稿IDの場合だけ、' ' を省略することができます。スラッグやタイトルの ' ' は、省略できません

参照■WordPress Codex日本語版「条件分岐タグ」


004_2 wp_is_mobile タグを使うか否か

レスポンシブ対応に関する覚書き


wordpress には、あらかじめ用意されている wp_is_mobile() というタグがあります。
これは「モバイル(スマホ・タブレット)から閲覧されているかどうか」という判定をします。

しかし、wordpressのwp_is_mobile() タグは、

mobile=スマートフォン&タブレット
PC=パソコン という判定をします。

これはちょっと違うんじゃないか? というか・・・

mobile=スマートフォン
それ以外は=タブレットとPC(widthでPCとタブレットを切り替える) 
としたいう方がいいのでは という意見があります。


各メディアの画面サイズ

PC (横幅:960px)
iPhone 4 / 4S (縦:640×960 横:960×640)
iPad (縦:768×1024px 横:1024×768px)


ということで、wp_is_mobile() タグは使わずに、新たに独自タグを設定する、という方法があります。


新しく is_mobile タグを作る(functions.php)

<?php
//スマホ表示分岐(is_mobileを有効にする)
function is_mobile(){
    $useragents = array(
        'iPhone', // iPhone
        'iPod', // iPod touch
        'Android.*Mobile', // 1.5+ Android *** Only mobile
        'Windows.*Phone', // *** Windows Phone
        'dream', // Pre 1.5 Android
        'CUPCAKE', // 1.5+ Android
        'blackberry9500', // Storm
        'blackberry9530', // Storm
        'blackberry9520', // Storm v2
        'blackberry9550', // Storm v2
        'blackberry9800', // Torch
        'webOS', // Palm Pre Experimental
        'incognito', // Other iPhone browser
        'webmate' // Other iPhone browser
 
    );
    $pattern = '/'.implode('|', $useragents).'/i';
    return preg_match($pattern, $_SERVER['HTTP_USER_AGENT']);
}
?>

functions.php に上記タグを追記すると、is_mobile タグを使うことができるようになります。
タブレットはこの中に入っていないので、PCと同じ扱いになります。


条件分岐

<?php if ( is_mobile() ) : ?>
	// スマホで表示させたい内容
<?php else: ?>
	// PCで表示させたい内容
<?php endif; ?>